import asyncio
from collections import defaultdict
from tools.log_handler import logger

class MessageQueue:
    def __init__(self, chat_handler):
        self.chat_handler = chat_handler
        self.queues = defaultdict(asyncio.Queue)  # 每个用户一个队列
        self.tasks = {}  # 跟踪每个用户的处理任务
        self.loop = asyncio.get_event_loop()
        logger.info("MessageQueue 初始化完成")
    
    async def add_message(self, user, content, callback):
        """
        添加消息到用户队列，并确保处理任务运行
        
        :param user: 用户标识（微信好友名）
        :param content: 消息内容
        :param callback: 回复回调函数
        """
        await self.queues[user].put((content, callback))
        logger.debug(f"添加到队列 - 用户: {user}, 内容: {content}")
        
        # 如果该用户还没处理任务，启动一个
        if user not in self.tasks:
            self.tasks[user] = asyncio.create_task(self.process_user_queue(user))
            logger.info(f"启动队列处理任务 - 用户: {user}")
    
    async def process_user_queue(self, user):
        """处理单个用户的消息队列"""
        queue = self.queues[user]
        while True:
            content, callback = await queue.get()
            try:
                reply = await self.chat_handler.process(user, content)
                logger.debug(f"回复{reply}")    
                # reply = await self.chat_handler.process(user, content)
                await callback(user, reply)
            except Exception as e:  
                logger.error(f"处理 {user} 消息失败: {e}")
                await callback(user, "哎呀，出错啦")
            queue.task_done()
            # 如果队列空了，清理任务
            if queue.empty():
                del self.tasks[user]
                logger.debug(f"队列已空，停止任务 - 用户: {user}")
                break
    
    def start(self):
        """初始化时无需显式启动，动态添加时自动处理"""
        logger.info("消息队列准备就绪")